%------------------------------------------------------------------------%
%              Comunicaciones digitales y analógicas                     %
%                      Trabajo Práctico N 1                              %
%                                                                        %
%                       Eric Lionel Koplin                               %
%------------------------------------------------------------------------%
%% Parámetros
close all;clear all;clc;

% Parámetros:
M = 16;
d = 2;

simbtx = (0:M-1)';
simbtx_bin = dec2bin(simbtx);
%% 1) Constelaciones y regiones de decision

%----------------------------------------------------------------- M-PAM BP
% Constelación
% como d=2 la energía del pulso formador es Ep=8/d^2

% Genero un objeto ”modulador PAM” con M = 4 , codigo Gray y la especifico
% por su energia promedio Eavg (definida mas arriba )
modPAM = comm.PAMModulator(M,'MinimumDistance',d,'SymbolMapping','Binary');
%modPAM = comm.PAMModulator(M,'MinimumDistance',d,'SymbolMapping','Gray');

simbmod = step(modPAM,simbtx); % simbolos modulados para su transmision
sm = [real(simbmod) imag(simbmod)];

%Plot:
plot(sm(:,1),sm(:,2),'x','MarkerFaceColor','g','MarkerSize',5);hold on;
xlabel('In-Phase');
ylabel('Quadrature');
title('Constelación M-PAM');

% labels
label_offset = [0*ones(M,1) 0.1*ones(M,1)];
plabels = arrayfun(@(n) {sprintf('s%d', n)}, (1:M)');
%plabels = arrayfun(@(n) {simbtx_bin(n,:)}, (1:M)');
Hpl = text(sm(:,1)+label_offset(:,1), sm(:,2) + label_offset(:,2),...
       plabels, 'FontWeight', ...
      'bold', 'HorizontalAlignment','center', ...
      'BackgroundColor', 'none');

%print('../Figs/constell_pam.png','-dpng')  % sii codificacion binaria
%print('../Figs/gray_pam.png','-dpng')      % sii codificacion gray

% Regiones de desición (sii codificacion binaria)
division = 1/2*(sm(1:end-1,:) + sm(2:end,:));
yL = get(gca,'YLim');
line([division(:,1) division(:,1)]',yL,'Color','r','LineStyle','-.');hold off;
%print('../Figs/region_pam.png','-dpng')

%-------------------------------------------------------------------- M-PSK
% Constelación
% como d=2 la energía del pulso formador es Ep=8/d^2
m= (1:M)';       % verctor de amplitudes
%sm = d/(2*sin(pi/M)) * [cos(2*pi/M * (m-1)) sin(2*pi/M * (m-1))];%simbolos

modPSK = comm.PSKModulator(M,'SymbolMapping','Binary'); 

simbmod = step(modPSK,simbtx); % simbolos modulados para su transmision
sm = [real(simbmod) imag(simbmod)];
sm = d/(2*sin(pi/M)).*sm; % desnormalizo la energia

% plot:
figure
plot(sm(:,1),sm(:,2),'x','MarkerFaceColor','g','MarkerSize',5); hold on;
xlabel('In-Phase');
ylabel('Quadrature');
title('Constelación M-PSK');

% labels
label_offset = [0*ones(M,1) 0.2*ones(M,1)];
plabels = arrayfun(@(n) {sprintf('s%d', n)}, (1:M)');
%plabels = arrayfun(@(n) {simbtx_bin(n,:)}, (1:M)');
Hpl = text(sm(:,1)+label_offset(:,1), sm(:,2) + label_offset(:,2),...
        plabels, 'FontWeight', ...
        'bold', 'HorizontalAlignment','center', ...
        'BackgroundColor', 'none');
%print('../Figs/constell_psk.png','-dpng')
%print('../Figs/gray_psk.png','-dpng')

% Regiones de desición (sii codificacion binaria)
division = 1/2*(sm(1:end,:) + [sm(2:end,:);sm(1,:)]);
yL = get(gca,'YLim');
%line(median(:,1),median(:,2),)
plotv(division','-.r'); hold off;
%print('../Figs/region_psk.png','-dpng')

%---------------------------------------------------------------------M-QAM
% como d=2 la energía del pulso formador es Ep=8/d^2
modQAM = comm.RectangularQAMModulator(M,'MinimumDistance',d,...
                                        'SymbolMapping','Binary');
%modQAM = comm.RectangularQAMModulator(M,'MinimumDistance',d,...
%                                        'SymbolMapping','Gray'); 
% modulador
simbmod = step(modQAM,simbtx); % simbolos modulados
sm = [real(simbmod) imag(simbmod)];


%Constelación:
figure
plot(sm(:,1),sm(:,2),'x','MarkerFaceColor','g','MarkerSize',5); hold on;
xlabel('In-Phase');
ylabel('Quadrature');
title('Constelación M-QAM');

% labels
label_offset = [0*ones(M,1) 0.2*ones(M,1)];
plabels = arrayfun(@(n) {sprintf('s%d', n)}, (1:M)');% sii codif Bianria
%plabels = arrayfun(@(n) {simbtx_bin(n,:)}, (1:M)'); % sii codif Gray
Hpl = text(sm(:,1)+label_offset(:,1), sm(:,2) + label_offset(:,2),...
        plabels, 'FontWeight', ...
        'bold', 'HorizontalAlignment','center', ...
        'BackgroundColor', 'none');
%print('../Figs/constell_qam.png','-dpng')
%print('../Figs/gray_qam.png','-dpng')

% Regiones de desición (sii codificacion binaria)
range = unique(sm);
division = (range + [range(2:end) ; range(1)])/2;
yL = get(gca,'YLim');
xL = get(gca,'XLim');
line([division(:,1) division(:,1)]',yL,'Color','r','LineStyle','-.')
line(xL,[division(:,1) division(:,1)]','Color','r','LineStyle','-.');hold off;
%print('../Figs/region_qam.png','-dpng')

%% 2) Montecarlo

